package com.kedacom.ctsp.authz.security.captcha;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.awt.image.BufferedImage;
import java.util.Date;

/**
 * 验证码接口
 *
 * @author sunchenjie
 * @create 2017-12-28 14:32
 **/
public interface CaptchaService {


    /**
     * 保存在session中 密码输错的次数
     */
    String PWD_WRONG_TIMES = "PWD_WRONG_TIMES";

    /**
     * 保存在 session中key名
     *
     * @return
     */
    String sessionKeyValue();

    /**
     * 时间 保存在session中的key 名
     *
     * @return
     */
    String sessionKeyDateValue();

    /**
     * 随机生成验证码
     *
     * @return
     */
    String createText();

    /**
     * 根据验证码生成图片
     */
    BufferedImage createImage(String captchaText);


    /**
     * 检验验证码
     */
    Boolean checkCaptcha(HttpServletRequest request, String captcha);


    /**
     * 返回是否在限制次数内
     *
     * @param request
     * @param times
     * @return true:不用显示/验证验证码 false:需要显示/验证验证码
     */
    default boolean checkWrongTimes(HttpServletRequest request, int times) {
        if (times == 0) {
            return false;
        }
        HttpSession session = request.getSession();
        Object obj = session.getAttribute(PWD_WRONG_TIMES);
        if (obj == null) {
            return true;
        } else {
            if ((int) obj >= times) {
                return false;
            } else {
                return true;
            }
        }
    }


    /**
     * 当前登录失败次数
     *
     * @param session
     * @return
     */
    default int getLoginWrongTimes(HttpSession session) {
        Object obj = session.getAttribute(PWD_WRONG_TIMES);
        if (obj == null) {
            return 0;
        } else {
            int times = (int) session.getAttribute(PWD_WRONG_TIMES);
            return times;
        }
    }

    /**
     * 登录密码错误次数+1
     * 登录失败后调用
     *
     * @param session
     */
    default void addLoginWrongTimes(HttpSession session) {
        int times = getLoginWrongTimes(session);
        session.setAttribute(PWD_WRONG_TIMES, times + 1);
    }

    /**
     * 清空登录失败次数
     * 登录成功后调用
     *
     * @param session
     */
    default void clearLoginWrongTimes(HttpSession session) {
        session.removeAttribute(PWD_WRONG_TIMES);
    }


    /**
     * 自定义setSession值
     *
     * @param session
     * @param capText
     * @param date
     */
    void setSessionValue(HttpSession session, String capText, Date date);
}